*&---------------------------------------------------------------------*
*& Report ZEX_LISTING_59                                               *
*&---------------------------------------------------------------------*
*& Created By: James Wood (james.wood@bowdarkconsulting.com)           *
*& Created On: 12/12/2008                                              *
*& Purpose:    This program demonstrates composition techniques.       *
*&---------------------------------------------------------------------*
REPORT zex_listing_59.

*----------------------------------------------------------------------*
*       CLASS lcl_delivery DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_delivery DEFINITION.

  PUBLIC SECTION.
    METHODS: constructor,
             get_delivery_date RETURNING value(re_date)
                                    TYPE sydatum.

  PRIVATE SECTION.
    DATA: delivery_date TYPE sydatum.

ENDCLASS.                    "lcl_delivery DEFINITION
*----------------------------------------------------------------------*
*       CLASS lcl_delivery IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_delivery IMPLEMENTATION.

  METHOD constructor.
    delivery_date = sy-datum.
  ENDMETHOD.                    "constructor

  METHOD get_delivery_date.
    re_date = delivery_date.
  ENDMETHOD.                    "get_delivery_date

ENDCLASS.                    "lcl_delivery IMPLEMENTATION

*----------------------------------------------------------------------*
*       CLASS lcl_order DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_order DEFINITION.

  PUBLIC SECTION.
    METHODS: constructor IMPORTING im_id TYPE i,
             release,
             track.

  PRIVATE SECTION.
    DATA: id TYPE i,
          delivery TYPE REF TO lcl_delivery.

ENDCLASS.                    "lcl_order DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_order IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_order IMPLEMENTATION.

  METHOD constructor.
    id = im_id.
  ENDMETHOD. "constructor

  METHOD release.
*   Arbitrarily create a delivery for the order...
    CREATE OBJECT delivery.
  ENDMETHOD. "release

  METHOD track.
*   Local Data Declarations:
    DATA: lv_delivery_date TYPE sydatum.

*   Track the delivery associated with this order:
    lv_delivery_date = delivery->get_delivery_date( ).
    WRITE: / 'Order #', id, 'was shipped on', lv_delivery_date.
  ENDMETHOD. "track

ENDCLASS.                    "lcl_order IMPLEMENTATION

*----------------------------------------------------------------------*
* START-OF-SELECTION Event Module                                      *
*----------------------------------------------------------------------*
START-OF-SELECTION.
  PERFORM test_order.

*&---------------------------------------------------------------------*
*&      Form  test_order
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM test_order.

* Local Data Declarations:
  DATA: lr_order TYPE REF TO lcl_order.

* Create a new order:
  CREATE OBJECT lr_order
    EXPORTING
      im_id = 1.

* Release the order:
  lr_order->release( ).

* Track the order:
  lr_order->track( ).

ENDFORM.                    "test_order